package com.rabbiter.hospital.controller;

import com.rabbiter.hospital.pojo.Drug;
import com.rabbiter.hospital.service.DrugService;
import com.rabbiter.hospital.utils.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("drug")
public class DrugController {
    @Autowired
    private DrugService drugService;

    /**
     * 分页模糊查询所有药物信息
     * @param pageNumber 页码
     * @param size       每页大小
     * @param query      模糊查询的关键词
     * @return 返回药物信息的响应数据
     */
    @RequestMapping("findAllDrugs")
    public ResponseData findAllDrugs(int pageNumber, int size, String query) {
        // 返回分页模糊查询到的所有药物信息
        return ResponseData.success("返回所有药物信息成功", this.drugService.findAllDrugs(pageNumber, size, query));
    }

    /**
     * 根据id查找药物
     * 该方法通过药物id查找并返回药物信息
     * 使用RequestMapping注解指定URL映射，以便处理HTTP请求
     * @param drId 药物的id，用于查找特定的药物信息
     * @return 返回一个ResponseData对象，包含根据id查找药物的结果
     */
    @RequestMapping("findDrug")
    public ResponseData findDrug(int drId) {
        return ResponseData.success("根据id查找药物成功", this.drugService.findDrug(drId));
    }

    /**
     * 根据id删除药物数量
     * @param drId       药物的唯一标识符
     * @param usedNumber 要删除的药物数量
     * @return 返回操作结果的响应数据对象
     * <p>
     * 此方法用于根据提供的药物id和数量，从库存中减少相应数量的药物。
     * 它调用drugService中的reduceDrugNumber方法来执行操作，并根据操作结果返回相应的响应数据。
     */
    @RequestMapping("reduceDrugNumber")
    public ResponseData reduceDrugNumber(int drId, int usedNumber) {
        if (this.drugService.reduceDrugNumber(drId, usedNumber)) return ResponseData.success("根据id删除药物数量成功");
        return ResponseData.fail("根据id删除药物数量失败");
    }

    /**
     * 增加药物信息
     * 该方法用于接收客户端发送的新增药物信息请求
     * @param drug 药物对象，包含需要添加的药物信息
     * @return ResponseData对象，包含操作结果和相应信息
     */
    @RequestMapping("addDrug")
    @ResponseBody
    public ResponseData addDrug(Drug drug) {
        // 调用drugService的addDrug方法尝试添加药物信息
        Boolean bo = this.drugService.addDrug(drug);
        // 根据添加结果返回相应的ResponseData对象
        if (bo) {
            return ResponseData.success("增加药物信息成功");
        }
        // 如果添加失败，返回失败信息
        return ResponseData.fail("增加药物信息失败！账号或已被占用");
    }

    /**
     * 删除药物信息
     * @param drId 药物ID，用于标识要删除的药物信息
     * @return 返回删除操作的结果，成功或失败
     */
    @RequestMapping("deleteDrug")
    public ResponseData deleteDrug(@RequestParam(value = "drId") int drId) {
        // 调用药物服务的删除药物方法，尝试删除指定的药物信息
        Boolean bo = this.drugService.deleteDrug(drId);
        // 根据删除操作的结果返回相应的响应数据
        if (bo) {
            return ResponseData.success("删除药物信息成功");
        }
        return ResponseData.fail("删除药物信息失败");
    }

    /**
     * 修改药物信息
     * 通过调用药物服务中的modifyDrug方法来修改药物信息
     * 使用@ResponseBody注解确保返回的数据直接被写入HTTP响应体中
     * @param drug 包含需要修改的药物信息的Drug对象
     * @return ResponseData对象，包含操作结果
     */
    @RequestMapping("modifyDrug")
    @ResponseBody
    public ResponseData modifyDrug(Drug drug) {
        this.drugService.modifyDrug(drug);
        return ResponseData.success("修改药物信息成功");
    }

}
